package com.aigou.utils;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Map;
import java.util.UUID;

import com.alibaba.fastjson2.JSON;

/**
 * 后端调用上传工具类
 * @author chenwei
 *
 */
public class UploadImageUtil {

	//访问地址
	private static String address = "http://localhost:9999";
	
	private String url; //上传地址
	private String filePath; //文件路径
	private InputStream inputStream; //文件流
	private String originalName; //原始文件名

	/**
	 * 
	 * @param url 上传地址
	 * @param filePath 文件路径
	 * @param originalName 原始文件名
	 */
	public UploadImageUtil(String url, String filePath, String originalName) {
		this.url = url;
		this.filePath = filePath;
		this.originalName = originalName;
	}
	
	/**
	 * 
	 * @param url 上传地址
	 * @param inputStream 文件流
	 * @param originalName 原始文件名
	 */
	public UploadImageUtil(String url, InputStream inputStream, String originalName) {
		this.url = url;
		this.inputStream = inputStream;
		this.originalName = originalName;
	}

	/**
	 * 上传图片方法，将本地图片上传到 url 地址
	 * @return 上传后的可访问的地址
	 */
	public String httpUpload(){
		String boundary="-------------------------7e020233150564";//编节符，边界符，可自行定义
		String prefix="--";//前缀 上传时需要多出两个-- 一定需要注意！！！
		String end="\r\n";//这里也需要注意，在html协议中，用 “/r/n” 换行，而不是 “/n”。

		SimpleDateFormat adf=new SimpleDateFormat("HHmmss");//通过时间来创建文件名
//		String uploadname=adf.format(new Date())+".jsp";//上传的文件名称

		try {
			URL http=new URL(url);
			HttpURLConnection conn= (HttpURLConnection) http.openConnection();
			conn.setRequestMethod("POST");
			conn.setReadTimeout(5000);
			conn.setDoInput(true);//准许向服务器读数据
			conn.setDoOutput(true);//准许向服务器写入数据

			/*设置向服务器上传数据的请求方式  默认的是表单形式
			 * 通过Content-Type协议向服务器上传数据
			 * boundary
			 * */
			conn.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary);

			//创建一个输出流对象，
			DataOutputStream out=new DataOutputStream(conn.getOutputStream());
			/*
			 *
              -----------------------------7e020233150564
              Content-Disposition: form-data; name="file"; filename="I:\迅雷下载\18fb1f51c9eb63489cce9e029154782e.jpg"
              Content-Type: image/jpeg
                                        //这里是空一行  需要注意
              <二进制文件数据未显示>
              ---------------------------7e020233150564--
			 */
			//向服务器写入数据  这里就需要完全根据以上协议格式来写，需要仔细，避免出错。
			out.writeBytes(prefix+boundary+end);//这是第一行  并回车换行
			//这是第二行，文件名和对应服务器的
			out.writeBytes("Content-Disposition: form-data; name=\"uploadFile\"; filename=\""+originalName+"\""+end);//这是第二行
			out.writeBytes(end);//空一行
			
			//以下写入图片
			if (inputStream == null) {
				inputStream = new FileInputStream(new File(filePath));
			}
			byte[] b = new byte[1024 * 4];//缓冲区
			int len;
			//循环读数据
			while((len = inputStream.read(b)) != -1){
				out.write(b, 0, len);
			}
			//写完数据后 回车换行
			out.writeBytes(end);
			out.writeBytes(prefix + boundary + prefix + end);
			out.flush();//清空

			//创建一个输入流对象  获取返回的信息  是否上传成功
			BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
			StringBuffer sb=new StringBuffer();
			String str;
			while((str=reader.readLine())!=null){
				sb.append(str);
			}
			//关闭流信息
			if(out!=null)out.close();
			if(reader!=null)reader.close();

			
			return sb.toString();
			
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	
	/**
	 * 获取可访问路径
	 * @param url 例：C:\\Pictures\\tupian.png（win10家庭版不能读取系统目录）
	 * @return 例：http://localhost:9999/image/79c0dcc9-8d4f-4cb1-aee1-b922973f3a08.png 或 null
	 */
	public static String getImageUrl(String url) {
		String imageUrl = null;
		
		// 获取文件名，随机生成即可
		String originalName = url.substring(url.lastIndexOf("."));
		originalName = UUID.randomUUID() + originalName;
		
		try {
			imageUrl = getImageUrl(new FileInputStream(new File(url)), originalName);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return imageUrl;
	}
	
	/**
	 * 获取可访问路径
	 * @param inputStream 文件流
	 * @param originalName 例：pictures.png
	 * @return 例：http://localhost:9999/image/79c0dcc9-8d4f-4cb1-aee1-b922973f3a08.png 或 null
	 */
	public static String getImageUrl(InputStream inputStream, String originalName) {
		String imageUrl = null;
		
		try {
			UploadImageUtil uploadImageUtil = null;
			uploadImageUtil = new UploadImageUtil(
					address + "/fileUpload"
					, inputStream
					, originalName);


			//例：result == {success: true, url: "/image/79c0dcc9-8d4f-4cb1-aee1-b922973f3a08.png"
			//address + result.url == “http://localhost:9999/image/79c0dcc9-8d4f-4cb1-aee1-b922973f3a08.png”可直接访问

			String result = uploadImageUtil.httpUpload();
			// ObjectMapper om = new ObjectMapper();
			Map mapResult = null;
			//mapResult = om.readValue(result, Map.class);
			mapResult = JSON.parseObject(result, Map.class);

			if (Boolean.parseBoolean(mapResult.get("success").toString())) {
				imageUrl = address + mapResult.get("url");
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return imageUrl;
	}
}

